home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib06.dsk
/
X-Y PLOT.bas
< prev
Wrap
BASIC Source File
|
2023-02-26
|
9KB
|
296 lines
1 REM *****************************
2 REM * GRAPHING PROGRAM I *
3 REM * X-Y PLOT *
4 REM * BY ROB SMYTHE *
5 REM * COPYRIGHT (C) 1981 *
6 REM * BY MICRO-SPARC INC *
7 REM *****************************
13 HOME : VTAB 5: HTAB 10: PRINT "GRAPHING PROGRAM 1"
14 VTAB 15: HTAB 13: PRINT "R.M. SMYTHE"
15 FOR I = 1 TO 2000: NEXT
16 :
17 REM SET UP PROGRAM
18 :
19 GOSUB 10000: REM INITIALIZE HRCG
20 POKE -16302,0: LOMEM: 16400
30 M$ = " "
40 S$ = " "
50 FLAG = 0
60 DIM X(20),Y(20)
70 D$ = CHR$(4):G$ = CHR$(7)
97 :
98 REM CONTROL CHARACTERS
99 :
100 CP$ = CHR$(16): REM CLEAR PAGE
110 CL$ = CHR$(12): REM LOWER CASE
120 CK$ = CHR$(11): REM UPPER CASE
130 CO$ = CHR$(15): REM OPTIONS
140 CS$ = CHR$(19): REM SHIFT
150 CY$ = CHR$(25): REM SET TEXT WINDOW TO FULL SCREEN
160 CA$ = CHR$(1): REM SELECT CHARACTER SET OR PAGE 1 OPTION
170 PRINT CO$,CA$: REM USE PG 1
180 PRINT CY$;CP$
190 GOTO 1000
197 :
198 REM DRAW X,Y AXES
199 :
200 PRINT CP$
210 GOSUB 600: REM ADD SCALES
220 HCOLOR= 3: HPLOT 52,20 TO 52,151 TO 275,151
230 RETURN
297 :
298 REM PLOT POINTS
299 :
300 FOR I = 1 TO N -1
310 X1 = INT(X(I) *FX%/MX +53.5)
320 Y1 = INT(151 -Y(I) *122/MY +.5)
330 X2 = INT(X(I +1) *FX%/MX +53.5)
340 Y2 = INT(151 -Y(I +1) *122/MY +.5)
350 HCOLOR= 3
360 FOR J = -1 TO 1: FOR K = -1 TO 1
370 HPLOT X1 +J,Y1 +K
380 NEXT K,J
390 HCOLOR= 3: HPLOT X1,Y1 TO X2,Y2: NEXT
400 FOR J = -1 TO 1: FOR K = -1 TO 1: HPLOT X2 +J,Y2 +K: NEXT K,J
410 RETURN
597 :
598 REM ADD SCALES TO GRAPH
599 :
600 VTAB 20: HTAB 8: PRINT HA$: HTAB 8: PRINT SC$
605 IF S1$ < >"" THEN 610
606 VTAB 4: IF LEN( STR$(MY)) >4 THEN HTAB (4): GOTO 608
607 HTAB (8 - LEN( STR$(MY)))
608 PRINT MY: RETURN
610 V% = 20
620 H% = 7: VTAB 22:V$ = S1$: GOSUB 9000
630 H% = 6: VTAB 22:V$ = S2$: GOSUB 9000
640 H% = 5: VTAB 22:V$ = S3$: GOSUB 9000
650 RETURN
697 :
698 REM BEGIN INPUT
699 :
700 PRINT CP$;CL$;CS$;"THIS ROUTINE WILL PLOT POINTS ON AN X,Y GRAPH, WITH (0,0) IN BOTTOM LEFT CORNER."
710 PRINT : PRINT CS$;"ENTER POINTS. ";CS$;"WHEN FINISHED, ENTER A NEGATIVE NUMBER."
720 PRINT : PRINT CS$;"HIT <RETURN> AFTER ENTERING EACH NUMBER."
730 VTAB 10: PRINT " X Y"
740 HCOLOR= 3
750 HPLOT 10,84 TO 150,84
760 HPLOT 75,74 TO 75,191
770 VTAB 12: PRINT CHR$(22)
780 I = 1
790 MX = 0:MY = 0
800 HTAB (4): INPUT X(I): IF X(I) <0 THEN N = I -1: GOTO 890
810 VTAB PEEK(37): HTAB (14)
820 HPLOT 75,90 TO 75,191: INPUT Y(I)
830 IF Y(I) <0 THEN N = I -1: GOTO 890
840 IF X(I) >MX THEN MX = X(I)
850 IF Y(I) >MY THEN MY = Y(I)
860 IF I >7 THEN PRINT CO$CS$
870 I = I +1
880 GOTO 800
890 NUMPTS = N: RETURN
997 :
998 REM *** MAIN PROGRAM ***
999 :
1000 GOSUB 700: REM INPUT DATA
1010 GOSUB 5000: REM SORT X'S
1020 PRINT CY$;CP$: REM CLEAR FULL SCREEN
1030 GOSUB 4000: REM HORIZONTAL SCALE
1040 GOSUB 6000: REM VERTICAL SCALE
1050 GOSUB 200: REM DRAW AXES
1060 GOSUB 300: REM PLOT
1070 POKE -16368,0
1080 A = PEEK( -16384): IF A <128 THEN 1080
1090 POKE -16368,0
1100 A$ = CHR$(A -128)
1110 IF A$ = "X" THEN 1230
1120 IF A$ = "Y" THEN 1190
1130 IF A$ = "T" THEN 1260
1140 IF A$ = "S" THEN 1300
1150 IF A$ = "A" THEN 1000
1160 IF A$ = "E" THEN VTAB 23: END
1170 FOR I = 1 TO 20: NEXT
1180 GOTO 1080
1190 H% = 3:V% = 20:L = 18
1200 GOSUB 8000
1210 FLAG = 1
1220 GOTO 1070
1230 L = 30:V% = 23
1240 GOSUB 7000
1250 GOTO 1070
1260 L = 35:V% = 2: GOSUB 7000: GOTO 1070
1270 :
1280 REM SAVE
1290 :
1300 VTAB 10: PRINT G$;G$
1310 F$ = ""
1320 POKE -16368,0
1330 A = PEEK( -16384): IF A <128 THEN 1330
1340 POKE -16368,0
1350 A$ = CHR$(A -128): IF A$ = CHR$(13) THEN 1380
1360 IF F$ = "" AND (A$ <"A" OR A$ >"Z") THEN 1300
1370 F$ = F$ +A$: GOTO 1330
1380 IF F$ = "" THEN 1300
1390 PRINT G$;G$;G$:F$ = "GR-" +F$
1400 PRINT D$;"BSAVE";F$;",A8192,L8192"
1410 GOTO 1070
3997 :
3998 REM HORIZONTAL SCALE
3999 :
4000 IF MX >100 THEN 4210
4010 IF MX >50 THEN MX = 100: GOTO 4100
4020 IF MX >20 THEN MX = 50: GOTO 4130
4030 IF MX >10 THEN MX = 20: GOTO 4150
4040 IF MX >5 THEN MX = 10: GOTO 4160
4050 IF MX >1 THEN MX = 5: GOTO 4170
4060 IF MX >.5 THEN MX = 1: GOTO 4180
4070 IF MX >.1 THEN MX = .5: GOTO 4190
4080 IF MX >.01 THEN MX = .1: GOTO 4200
4090 GOTO 4210
4100 SC$ = "0 20 40 60 80 100"
4110 MX = 100
4120 HA$ = "' ' ' ' ' ' ' ' ' ' '":FX% = 208: RETURN
4130 SC$ = "0 10 20 30 40 50"
4140 GOTO 4120
4150 SC$ = "0 2 4 6 8 10 12 14 16 18 20": GOTO 4120
4160 SC$ = "0 1 2 3 4 5 6 7 8 9 10": GOTO 4120
4170 SC$ = "0 1 2 3 4 5": GOTO 4120
4180 SC$ = "0 .2 .4 .6 .8 1.0": GOTO 4120
4190 SC$ = "0 .10 .20 .30 .40 .50": GOTO 4120
4200 SC$ = "0 .02 .04 .06 .08 .10": GOTO 4120
4210 SC$ = RIGHT$(" " + STR$(MX$),31):HA$ = "' '":FX% = 208: RETURN
4997 :
4998 REM SORT IN INCREASING X
4999 :
5000 L = INT(NUMPTS/2) +1
5010 K = NUMPTS
5020 IF L = 1 THEN 5060
5030 L = L -1
5040 X = X(L):Y = Y(L)
5050 GOTO 5100
5060 X = X(K):Y = Y(K)
5070 X(K) = X(L):Y(K) = Y(L)
5080 K = K -1
5090 IF K <1 THEN X(I) = X:Y(I) = Y: RETURN
5100 J = L
5110 I = J
5120 J = J +J
5130 IF J >K THEN X(I) = X:Y(I) = Y: GOTO 5020
5140 IF J <K THEN IF X(J) <X(J +1) THEN J = J +1
5150 IF X > = X(J) THEN X(I) = X:Y(I) = Y: GOTO 5020
5160 X(I) = X(J):Y(I) = Y(J): GOTO 5110
5997 :
5998 REM VERTICAL SCALE
5999 :
6000 S1$ = "":S2$ = S1$:S3$ = S2$: IF MY >100 THEN 6290
6010 IF MY >50 THEN MY = 100: GOTO 6100
6020 IF MY >20 THEN MY = 50: GOTO 6140
6030 IF MY >10 THEN MY = 20: GOTO 6170
6040 IF MY >5 THEN MY = 10: GOTO 6180
6050 IF MY >1 THEN MY = 5: GOTO 6200
6060 IF MY >.5 THEN MY = 1: GOTO 6210
6070 IF MY >.1 THEN MY = .5: GOTO 6230
6080 IF MY >.01 THEN MY = .1: GOTO 6250
6090 GOTO 6290
6100 S1$ = "0 0 0 0 0 0"
6110 S2$ = "0 8 6 4 2 "
6120 S3$ = "1 "
6130 RETURN
6140 S1$ = "0 0 0 0 0 0"
6150 S2$ = "5 4 3 2 1 "
6160 GOTO 6280
6170 S1$ = "0 6 2 8 4 0":S2$ = "2 1 1 ": GOTO 6280
6180 S1$ = "0 8 6 4 2 0"
6190 S2$ = "1 ": GOTO 6280
6200 S1$ = "5 4 3 2 1 0": GOTO 6270
6210 S1$ = "0 8 6 4 2 0":S2$ = ". . . . . "
6220 S3$ = "1 ": RETURN
6230 S1$ = "0 0 0 0 0 0":S2$ = "5 4 3 2 1 "
6240 S3$ = ". . . . . ": RETURN
6250 S1$ = "0 8 6 4 2 0":S2$ = "1 0 0 0 0 "
6260 S3$ = ". . . . . ": RETURN
6270 S2$ = " "
6280 S3$ = " ": RETURN
6290 RETURN : REM SCIENTIFIC NOTATION COULD GO HERE
6997 :
6998 REM LABEL X AXIS
6999 :
7000 B$ = MID$ (M$,1,L)
7010 VTAB V%
7020 GOSUB 7040
7030 RETURN
7040 I = 1
7050 H% = 40 -L -2
7060 HTAB (H%)
7070 PRINT MID$ (B$, LEN(B$) -L +1, LEN(B$));
7080 HTAB (H% +L)
7090 GET X$: IF X$ = CHR$(13) THEN 7210
7100 IF X$ < > CHR$(8) THEN 7150
7110 IF I = 1 THEN 7060
7120 B$ = MID$ (B$,1, LEN(B$) -1)
7130 I = I -1
7140 GOTO 7060
7150 IF I = L +1 THEN 7060
7170 IF ASC(X$) <32 THEN 7060
7180 B$ = B$ +X$
7190 I = I +1
7200 GOTO 7060
7210 B$ = MID$ (B$, LEN(B$) -I +2, LEN(B$))
7220 B$ = B$ + MID$ (S$,1,L - LEN(B$))
7230 PRINT
7240 RETURN
7997 :
7998 REM LABEL Y AXIS
7999 :
8000 B$ = MID$ (M$,1,L)
8010 HTAB H%
8020 VTAB (V%)
8030 GOSUB 8050
8040 RETURN
8050 I = 1
8060 VTAB (V%)
8070 V$ = MID$ (B$, LEN(B$) -L +1, LEN(B$)): GOSUB 9000: REM PRINT OUT VERTICAL STRING
8080 REM VTAB(V%-L%)
8090 GET X$: IF X$ = CHR$(13) THEN 8210
8100 IF X$ < > CHR$(8) THEN 8150
8110 IF I = 1 THEN 8060
8120 B$ = MID$ (B$,1, LEN(B$) -1)
8130 I = I -1
8140 GOTO 8060
8150 IF I = L +1 THEN 8060
8170 IF ASC(X$) <32 THEN 8060
8180 B$ = B$ +X$
8190 I = I +1
8200 GOTO 8060
8210 B$ = MID$ (B$, LEN(B$) -I +2, LEN(B$))
8220 B$ = B$ + MID$ (S$,1,L - LEN(B$))
8230 PRINT
8240 RETURN
8997 :
8998 REM PRINT OUT VERTICAL STRING
8999 :
9000 VTAB (V% - LEN(V$))
9010 FOR J = 1 TO LEN(V$)
9020 HTAB (H%)
9030 PRINT MID$ (V$,J,1)
9040 NEXT
9050 RETURN
9997 :
9998 REM INITIALIZE HRCG
9999 :
10000 ONERR GOTO 10130
10010 TEXT : HOME : HGR :ADRS = 0
10020 PRINT CHR$(4);"BLOAD RBOOT": CALL 520
10030 ADRS = USR(0),"HRCG"
10040 POKE 216,0
10050 IF ADRS <0 THEN ADRS = ADRS +65536
10060 CS = ADRS -768: HIMEM: CS
10070 D$ = CHR$(4)
10080 PRINT D$;"BLOAD ASCII.SET,A";CS
10090 CH = INT(CS/256):CL = CS -CH *256
10100 POKE ADRS +7,CL: POKE ADRS +8,CH: CALL ADRS +3
10110 RETURN
10130 TEXT
10140 PRINT "ERROR IN RLOAD OR RBOOT"
10150 POKE 216,0
10160 STOP